﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace PlanInterfejs
{
    public partial class NauczycieleControl : UserControl
    {
        PlanView _view;

        public PlanView View
        {
            get { return _view; }
            set { _view = value; }
        }
        public NauczycieleControl()
        {
            InitializeComponent();
        }

        private string GetNauczycielString(int idNauczyciela)
        {
            Nauczyciel nauczyciel =
                (from x in DAL.database.Nauczyciel
                 where x.ID_Nauczyciel == idNauczyciela
                 select x).First();

            string str = nauczyciel.Imie + " " + nauczyciel.Nazwisko + " (";

            var query =
                from x in DAL.database.Nauczane_Przedmioty
                where x.Nauczyciel.ID_Nauczyciel == idNauczyciela
                select x.Przedmiot_Typy.Nazwa;

            foreach (string nazwaPrzedmiotu in query)
                str += nazwaPrzedmiotu + ", ";

            str = str.TrimEnd(new char[] { ' ', ',' });

            str += ")";

            return str;
        }

        

        void UpdateLbNauczyciele()
        {
            var nauczyciele = 
                from x in DAL.database.Nauczyciel
                select x;
            List<SimpleNauczyciel> snauczyciele = new List<SimpleNauczyciel>();
            foreach (Nauczyciel nauczyciel in nauczyciele)
            {
                SimpleNauczyciel temp = new SimpleNauczyciel(nauczyciel.ID_Nauczyciel);
                temp.pelnaNazwa = GetNauczycielString(temp.id);
                temp.imie = nauczyciel.Imie;
                temp.nazwisko = nauczyciel.Nazwisko;
                snauczyciele.Add(temp);
            }
            snauczyciele.Sort(SimpleNauczyciel.KomparujNauczycieli);
            lbNauczyciele.DataSource = snauczyciele;
            lbNauczyciele.DisplayMember = "pelnaNazwa";
        }

        void UpdateClbPrzedmioty()
        {
            clbPrzedmioty.DataSource = DAL.database.Przedmiot_Typy.Select(a => a);
            clbPrzedmioty.DisplayMember = "Nazwa";
        }

        void CheckPrzedmioty(int idNauczyciela)
        {
            var x =
                from a in DAL.database.Nauczane_Przedmioty
                where a.Nauczyciel.ID_Nauczyciel == idNauczyciela
                select a.Przedmiot_Typy.ID_Przedmiot_Typy;

            for (int i = 0; i < clbPrzedmioty.Items.Count; i++)
            {
                clbPrzedmioty.SetItemChecked(i, false);
            }

            foreach (int idPrzedmiot in x)
            {                
                for (int i = 0; i < clbPrzedmioty.Items.Count; i++)
                {
                    if (((Przedmiot_Typy)clbPrzedmioty.Items[i]).ID_Przedmiot_Typy == idPrzedmiot)
                    {
                        clbPrzedmioty.SetItemChecked(i, true);
                        break;
                    }
                }
            }
        }

        private void NauczycieleControl_Load(object sender, EventArgs e)
        {
            
        }

        private void lbNauczyciele_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Type typ = lbNauczyciele.SelectedItem.GetType();
            //int idNauczyciela = (int)typ.GetProperty("ID_Nauczyciel").GetValue(
            //    lbNauczyciele.SelectedItem, null);
            //CheckPrzedmioty(idNauczyciela);
        }

        private void btnDodaj_Click(object sender, EventArgs e)
        {
            if (clbPrzedmioty.CheckedIndices.Count == 0)
            {
                MessageBox.Show("Wybierz najpierw przedmioty, który uczy ten nauczyciel.", "Informacja");
                return;
            }
            if (tbNazwisko.Text.Split(new char[] { ' ' }).Count() != 2)
            {
                MessageBox.Show("Podaj imię i nazwisko.", "Informacja");
                return;
            }

            Nauczyciel nowyNauczyciel = new Nauczyciel();
            nowyNauczyciel.Imie = tbNazwisko.Text.Split(new char[] { ' ' })[0];
            nowyNauczyciel.Nazwisko = tbNazwisko.Text.Split(new char[] { ' ' })[1];

            DAL.database.AddToNauczyciel(nowyNauczyciel);

            for (int i = 0; i < clbPrzedmioty.Items.Count; i++)
            {
                if (clbPrzedmioty.GetItemChecked(i))
                {
                    Nauczane_Przedmioty nowyNauczanyPrzedmiot = new Nauczane_Przedmioty();
                    nowyNauczanyPrzedmiot.Nauczyciel = nowyNauczyciel;
                    nowyNauczanyPrzedmiot.Przedmiot_Typy = ((Przedmiot_Typy)clbPrzedmioty.Items[i]);
                    DAL.database.AddToNauczane_Przedmioty(nowyNauczanyPrzedmiot);
                }
            }
            
            DAL.database.SaveChanges();
            UpdateLbNauczyciele();
            for (int i = 0; i < clbPrzedmioty.Items.Count; i++)
                clbPrzedmioty.SetItemChecked(i, false);
            tbNazwisko.Text = "";
            lbNauczyciele.SelectedIndex = lbNauczyciele.Items.Count - 1;
        }

        private void btnUsun_Click(object sender, EventArgs e)
        {
            int id =((SimpleNauczyciel)lbNauczyciele.SelectedItem).id;
            var nauczyciel =
                (from x in DAL.database.Nauczyciel
                where x.ID_Nauczyciel == id
                select x).First();
            var nauczane = (from x in DAL.database.Nauczane_Przedmioty
                            where x.ID_Nauczyciel == id
                            select x);

            foreach (var nauczany in nauczane)
                DAL.database.Nauczane_Przedmioty.DeleteObject(nauczany);
            DAL.database.SaveChanges();
            
            DAL.database.DeleteObject(nauczyciel);
            DAL.database.SaveChanges();
            UpdateLbNauczyciele();
        }

        private void NauczycieleControl_VisibleChanged(object sender, EventArgs e)
        {
            UpdateLbNauczyciele();
            UpdateClbPrzedmioty();
        }
    }
}
